package pseudoAssemblerCompiler.twopassassembler.model;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

/**
 * Класс таблица команд операций.
 * 
 * @author Чекашов Р. И.
 */
public class ModelOperationCodeTable {
    
    /**
     * Таблица команд операций
     */
    private Map<String, int[]> _operationCodeTable;
    
    /**
     * Строковое представление таблицы команд операций
     */
    private List<String[]> _ocpString;
    
    /**
     * Создаём экземпляр таблицы
     * @param aTableSize размер таблицы
     */
    public ModelOperationCodeTable(int aTableSize) {
        _operationCodeTable = new LinkedHashMap<String, int[]>(
                                        1 + (int) (aTableSize / 0.75));
        _ocpString = new ArrayList<String[]>(aTableSize);
        init();
    }
    
    private void init() {
        //мнемокоды
        _operationCodeTable.put("JMP", new int[]{1, 4});
        _operationCodeTable.put("LOADR1", new int[]{2, 4});
        _operationCodeTable.put("LOADR2", new int[]{3, 4});
        _operationCodeTable.put("ADD", new int[]{4, 2});
        _operationCodeTable.put("SAVEB1", new int[]{5, 4});
        
        //директивы
        _operationCodeTable.put("START", new int[]{0, 0, 0});
        _operationCodeTable.put("END", new int[]{0, 0, 0});
        
        _operationCodeTable.put("WORD", new int[]{0, 3, 1});
        _operationCodeTable.put("BYTE", new int[]{0, 1, 1});
        //размер памяти для резервирования
        _operationCodeTable.put("RESB", new int[]{0, 1, 1});
        _operationCodeTable.put("RESW", new int[]{0, 3, 1});
        
        //=================================================
        _ocpString.add(new String[]{"JMP", "01", "4"});
        _ocpString.add(new String[]{"LOADR1", "02", "4"});
        _ocpString.add(new String[]{"LOADR2", "03", "4"});
        _ocpString.add(new String[]{"ADD", "04", "2"});
        _ocpString.add(new String[]{"SAVEB1", "05", "4"});
        
        _ocpString.add(new String[]{"START", "directive", "0"});
        _ocpString.add(new String[]{"END", "directive", "0"});
        
        _ocpString.add(new String[]{"WORD", "directive", "3"});
        _ocpString.add(new String[]{"BYTE", "directive", "1"});
        
        _ocpString.add(new String[]{"RESB", "directive", "1"});
        _ocpString.add(new String[]{"RESW", "directive", "3"});
    }
    
    public List<String[]> getOperationCodeTable() {
        return _ocpString;
    }
    
}
